package com.curricula.curriculum.action;

import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;

import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import com.curricula.curriculum.service.CurriculumService;
import com.curricula.curriculum.vo.ContactoVO;
import com.curricula.curriculum.vo.CurriculumVO;
import com.curricula.mensaje.vo.MsgVO;
import com.curricula.usuario.service.UsuarioService;
import com.curricula.usuario.vo.UsuarioVO;

/**
 * DispatchAction que controla las altas bajas y cambios en las peticiones de CURRICULUM;
 * esta clase interactua con los servicios de cada una de las subcategorias del curriculum
 * 
 * @author Hugo
 * @version 1.0
 * 
 */
public class CurriculumAction extends DispatchAction {
	MsgVO msg = new MsgVO();
	ActionForward forward = null;
	static Logger log = Logger.getLogger(CurriculumAction.class);
	
	/**
	 * Busca un perfil determinado por los parametros de busqueda que llena el usuario
	 * desde la JSP puede enviar peticion de busqueda utilizando como criterio un AND
	 * o un OR, los parametros de busqueda se obtienen a travez de un populate.
	 * 
	 * @author Hugo
	 * @param ActionMapping mapping
	 * @param ActionForm form
	 * @param HttpServletRequest request
	 * @param HttpServletResponse response
	 * @return mapping.findForward forward
	 * @throws InvocationTargetException 
	 * @throws IllegalAccessException 
	 */
	public ActionForward buscaPerfil(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ) throws IllegalAccessException, InvocationTargetException{
		CurriculumVO curriculum = new CurriculumVO();
		String criterio = request.getParameter("busqueda").toString().trim();
		try {
			UsuarioVO userSesion = (UsuarioVO) request.getSession().getAttribute("usuarioVO");			
			if(userSesion!=null){
				curriculum = CurriculumService.populate(request, userSesion);
				List<ContactoVO> perfil = CurriculumService.buscar(curriculum, criterio);
				if(perfil != null){
					HttpSession session = request.getSession();
					session.setAttribute("perfil", perfil);
					forward = mapping.findForward("perfil");
				}else{
					msg.setMsgTipo("informacion");
					msg.setMsgTitulo("Información de consulta");
					msg.setMsgDescripcion("No se encontró un perfil que coincidiera con los parámetros solicictados");
					request.setAttribute("msgVO", msg);
					forward = mapping.findForward("inicio");
				}				
			}else{
				msg.setMsgTipo("registro");
				msg.setMsgTitulo("Usuario no Registrado");
				msg.setMsgDescripcion("Debe iniciar sesion para poder modificar su información, por favor escriba un usuario y contraseña o registre una cuenta.");				
				request.setAttribute("msgVO", msg);
				forward = mapping.findForward("inicio");
			}
		} catch (SQLException e) {
			MsgVO msgbd = new MsgVO("bd", e);
			request.setAttribute("msgVO", msgbd);				
			forward = mapping.findForward("formulario");
		} catch (Exception e) {
			MsgVO msgerror = new MsgVO("error", e);
			request.setAttribute("msgVO", msgerror);				
			forward = mapping.findForward("formulario");
		}
		return forward;
	}
	
	
	/**
	 * Metodo utilizado en el caso de uso de personalizar ya que se llenan todos los registros 
	 * de las tablas con las que cuenta el usuario, asi como su visibilidad y el orden correcto para
	 * que pueda personalizar los campos ordenandolos o cambiando su visibilidad
	 * 
	 * @author Hugo
	 * @param ActionMapping mapping
	 * @param ActionForm form
	 * @param HttpServletRequest request
	 * @param HttpServletResponse response
	 * @return mapping.findForward forward
	 * @throws InvocationTargetException 
	 * @throws IllegalAccessException 
	 */
	public ActionForward populateTablas(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ) throws IllegalAccessException, InvocationTargetException{
		try {
			UsuarioVO userSesion = (UsuarioVO) request.getSession().getAttribute("usuarioVO");			
			if(userSesion!=null){
				CurriculumVO curriculum = CurriculumService.buscar(userSesion);
				if(curriculum != null){
					HttpSession session = request.getSession();
					session.setAttribute("aficionList", curriculum.getListaAficion());
					session.setAttribute("cursosList", curriculum.getListaCurso());
					session.setAttribute("direccionList", curriculum.getListaDireccion());
					session.setAttribute("documentoList", curriculum.getListaDocumentacion());
					session.setAttribute("emailsList", curriculum.getListaEmail());
					session.setAttribute("escolarList", curriculum.getListaEscolar());
					session.setAttribute("habilidadList", curriculum.getListaHabilidad());
					session.setAttribute("idiomaList", curriculum.getListaIdioma());
					session.setAttribute("publicacionList", curriculum.getListaPublicacion());
					session.setAttribute("telefonoList", curriculum.getListaTelefono());
					session.setAttribute("trabajoList", curriculum.getListaTrabajo());
					forward = mapping.findForward("personalizar");
				}else{
					msg.setMsgTipo("informacion");
					msg.setMsgTitulo("Información de consulta");
					msg.setMsgDescripcion("No se encontró un perfil que coincidiera con los parámetros solicitados");
					request.setAttribute("msgVO", msg);
					forward = mapping.findForward("inicio");
				}				
			}else{
				msg.setMsgTipo("registro");
				msg.setMsgTitulo("Usuario no Registrado");
				msg.setMsgDescripcion("Debe iniciar sesion para poder modificar su información, por favor escriba un usuario y contraseña o registre una cuenta.");				
				request.setAttribute("msgVO", msg);
				forward = mapping.findForward("inicio");
			}
		} catch (SQLException e) {
			MsgVO msgbd = new MsgVO("bd", e);
			request.setAttribute("msgVO", msgbd);				
			forward = mapping.findForward("inicio");
		} catch (Exception e) {
			MsgVO msgerror = new MsgVO("error", e);
			request.setAttribute("msgVO", msgerror);				
			forward = mapping.findForward("inicio");
		}
		return forward;
	}
	
	/**
	 * Genera un curriculum en formato PDF a peticion del usuario, toma como plantilla principal el campo 
	 * usr_plantilla de la tabla de USUARIO; el reporte es generado utilizando JasperReport y los codigos 
	 * fuente XML estan en /jsp/plantillas
	 * 
	 * @author Hugo
	 * @modify Carlos
	 * @param ActionMapping mapping
	 * @param ActionForm form
	 * @param HttpServletRequest request
	 * @param HttpServletResponse response
	 * @return mapping.findForward forward
	 * @throws InvocationTargetException 
	 * @throws IllegalAccessException 
	 */
	public ActionForward genera(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ) throws Exception{
		try {
			UsuarioVO userSesion = (UsuarioVO) request.getSession().getAttribute("usuarioVO");

			String noPlantilla=String.valueOf(userSesion.getUsrPlantilla());

			if(userSesion!=null){
				userSesion.setVisible("checked");
				CurriculumVO curriculum = CurriculumService.buscar(userSesion);

				if(curriculum != null){
					String urlBase="http://localhost:"+request.getLocalPort()+request.getContextPath()+"/jsp/plantillas/jasper"+noPlantilla+"/";
					
					Map<String,Object> mapaParametros = new HashMap<String,Object>();
					if(curriculum.getListaPersonal().size()>0){
					    mapaParametros.put("nombre", curriculum.getListaPersonal().get(0).getNombre());
					    mapaParametros.put("apellidoPaterno", curriculum.getListaPersonal().get(0).getApellidoPaterno());
					    mapaParametros.put("apellidoMaterno", curriculum.getListaPersonal().get(0).getApellidoMaterno());
					    mapaParametros.put("edad", String.valueOf(curriculum.getListaPersonal().get(0).getEdad()));
					    mapaParametros.put("sexo", curriculum.getListaPersonal().get(0).getSexo());
					    mapaParametros.put("edoCivil", curriculum.getListaPersonal().get(0).getEdoCivil());
					    mapaParametros.put("fechaNacimiento", curriculum.getListaPersonal().get(0).getFechaNacimiento());
					}
					
				    mapaParametros.put("SUBREPORT_DIR", urlBase);
				    mapaParametros.put("direccion", curriculum.getListaDireccion());
				    mapaParametros.put("telefono", curriculum.getListaTelefono());
				    mapaParametros.put("email", curriculum.getListaEmail());
				    mapaParametros.put("aficion", curriculum.getListaAficion());
				    mapaParametros.put("curso", curriculum.getListaCurso());
				    mapaParametros.put("documentacion", curriculum.getListaDocumentacion());
				    mapaParametros.put("escolar", curriculum.getListaEscolar());
				    mapaParametros.put("habilidad", curriculum.getListaHabilidad());
				    mapaParametros.put("idioma", curriculum.getListaIdioma());
				    mapaParametros.put("trabajo", curriculum.getListaTrabajo());
				    mapaParametros.put("publicacion", curriculum.getListaPublicacion());
					
				    JasperPrint parentPrint = null;
					InputStream reportStream = getServlet().getServletContext().getResourceAsStream("/jsp/plantillas/jasper"+noPlantilla+"/curriculum.jasper");
					try {
							parentPrint=JasperFillManager.fillReport( reportStream,mapaParametros,new JREmptyDataSource());
					} catch (Exception e) {
						log.error("ocurrio un error al generar impresion ...");
						e.printStackTrace();
					}


					response.setContentType( "application/pdf" );
				    response.setHeader("Content-Disposition", 
				    		"attachment; filename=CV_"+curriculum.getListaPersonal().get(0).getNombre().replace(" ", "_")+".pdf");
					ServletOutputStream out = response.getOutputStream();
					byte[] pdfByteArray = JasperExportManager.exportReportToPdf( parentPrint );
					
					response.setContentLength( pdfByteArray.length );
					out.write(pdfByteArray, 0, pdfByteArray.length);
					out.flush();
					out.close();

				
					forward = null;
				}	
			}else{
				msg.setMsgTipo("registro");
				msg.setMsgTitulo("Usuario no Registrado");
				msg.setMsgDescripcion("Debe iniciar sesion para poder modificar su información, por favor escriba un usuario y contraseña o registre una cuenta.");				
				request.setAttribute("msgVO", msg);
				forward = mapping.findForward("inicio");
			}
		} catch (SQLException e) {
			MsgVO msgbd = new MsgVO("bd", e);
			request.setAttribute("msgVO", msgbd);				
			forward = mapping.findForward("inicio");
		} catch (Exception e) {
			MsgVO msgerror = new MsgVO("error", e);
			request.setAttribute("msgVO", msgerror);				
			forward = mapping.findForward("inicio");
		}
		return forward;
	}
	
	/**
	 * Genera un curriculum en formato PDF a peticion del administrador, toma como plantilla principal el campo 
	 * usr_plantilla de la tabla de USUARIO; el reporte es generado utilizando JasperReport y los codigos 
	 * fuente XML estan en /jsp/plantillas
	 * 
	 * @author Hugo
	 * @modify Carlos
	 * @param ActionMapping mapping
	 * @param ActionForm form
	 * @param HttpServletRequest request
	 * @param HttpServletResponse response
	 * @return mapping.findForward forward
	 * @throws InvocationTargetException 
	 * @throws IllegalAccessException 
	 */
	public ActionForward generaAdmin(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response ) throws Exception{
		try {
			UsuarioVO userId = new UsuarioVO();
			UsuarioVO generar = new UsuarioVO();
			userId.setUsrId(Integer.valueOf(request.getParameter("userId")));
			generar = UsuarioService.busca(userId);
			
			String noPlantilla=String.valueOf(generar.getUsrPlantilla());

			if(generar!=null){
				generar.setVisible("checked");
				CurriculumVO curriculum = CurriculumService.buscar(generar);

				if(curriculum != null){
					String urlBase="http://localhost:"+request.getLocalPort()+request.getContextPath()+"/jsp/plantillas/jasper"+noPlantilla+"/";
					
					Map<String,Object> mapaParametros = new HashMap<String,Object>();
					if(curriculum.getListaPersonal().size()>0){
					    mapaParametros.put("nombre", curriculum.getListaPersonal().get(0).getNombre());
					    mapaParametros.put("apellidoPaterno", curriculum.getListaPersonal().get(0).getApellidoPaterno());
					    mapaParametros.put("apellidoMaterno", curriculum.getListaPersonal().get(0).getApellidoMaterno());
					    mapaParametros.put("edad", String.valueOf(curriculum.getListaPersonal().get(0).getEdad()));
					    mapaParametros.put("sexo", curriculum.getListaPersonal().get(0).getSexo());
					    mapaParametros.put("edoCivil", curriculum.getListaPersonal().get(0).getEdoCivil());
					    mapaParametros.put("fechaNacimiento", curriculum.getListaPersonal().get(0).getFechaNacimiento());
					}
					
				    mapaParametros.put("SUBREPORT_DIR", urlBase);
				    mapaParametros.put("direccion", curriculum.getListaDireccion());
				    mapaParametros.put("telefono", curriculum.getListaTelefono());
				    mapaParametros.put("email", curriculum.getListaEmail());
				    mapaParametros.put("aficion", curriculum.getListaAficion());
				    mapaParametros.put("curso", curriculum.getListaCurso());
				    mapaParametros.put("documentacion", curriculum.getListaDocumentacion());
				    mapaParametros.put("escolar", curriculum.getListaEscolar());
				    mapaParametros.put("habilidad", curriculum.getListaHabilidad());
				    mapaParametros.put("idioma", curriculum.getListaIdioma());
				    mapaParametros.put("trabajo", curriculum.getListaTrabajo());
				    mapaParametros.put("publicacion", curriculum.getListaPublicacion());
					
				    JasperPrint parentPrint = null;
					InputStream reportStream = getServlet().getServletContext().getResourceAsStream("/jsp/plantillas/jasper"+noPlantilla+"/curriculum.jasper");
					try {
							parentPrint=JasperFillManager.fillReport( reportStream,mapaParametros,new JREmptyDataSource());
					} catch (Exception e) {
						log.error("ocurrio un error al generar impresion ...");
						e.printStackTrace();
					}


					response.setContentType( "application/pdf" );
					response.setHeader("Content-Disposition", 
						    "attachment; filename=CV_"+curriculum.getListaPersonal().get(0).getNombre().replace(" ", "_")+".pdf");
					ServletOutputStream out = response.getOutputStream();
					byte[] pdfByteArray = JasperExportManager.exportReportToPdf( parentPrint );
					
					response.setContentLength( pdfByteArray.length );
					out.write(pdfByteArray, 0, pdfByteArray.length);
					out.flush();
					out.close();

				
					forward = null;
				}	
			}else{
				msg.setMsgTipo("registro");
				msg.setMsgTitulo("Usuario no Registrado");
				msg.setMsgDescripcion("Debe iniciar sesion para poder modificar su información, por favor escriba un usuario y contraseña o registre una cuenta.");				
				request.setAttribute("msgVO", msg);
				forward = mapping.findForward("inicio");
			}
		} catch (SQLException e) {
			MsgVO msgbd = new MsgVO("bd", e);
			request.setAttribute("msgVO", msgbd);				
			forward = mapping.findForward("inicio");
		} catch (Exception e) {
			MsgVO msgerror = new MsgVO("error", e);
			request.setAttribute("msgVO", msgerror);				
			forward = mapping.findForward("inicio");
		}
		return forward;
	}
	
}
